

package com.infusionesuci2Pro;

import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.DecimalFormat;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.google.analytics.tracking.android.EasyTracker;
import com.google.analytics.tracking.android.GoogleAnalytics;
import com.google.analytics.tracking.android.MapBuilder;
import com.infusionesuci.utils.Archivos;
import com.infusionesuci.utils.Geolocalizacion;
import com.infusionesuci.utils.GlobalConfiguration;
import com.infusionesuci.utils.WebService;
import com.infusionesuci2Pro.R;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Typeface;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;


public class ShowDetailMedicamentos extends Activity implements OnItemSelectedListener,TextWatcher {
	
	private Archivos archivos;
	private InputStreamReader archivoEntrada;
	private OutputStreamWriter archivoSalida;
	private Medicamento temMed;
	private int dilucion;
	private Spinner sp;
	private EditText dosisIntroducida;
	private EditText pesoIntroducido;
	private EditText ampollasIntroducidas;
	private TelephonyManager mngr;
	private WebService ws;
	private String info;
	
	//Geolocalizacion:
	private Double [] coordenadas;

	// Detalles de la infusion
	private String imei;
	private String nombreMedicamentoInfusion;
	private String dosisInfusion;
	private String pesoInfusion;
	private String ampollasInfusion;

	// Respuesta:
	private TextView dilu;
	private TextView namp;
	private TextView ampen;
	private TextView vol;
	private TextView pasen;
	private TextView res;
	private TextView tvDosis;
	private TextView tvAmp;
	private TextView tvPresen;
	private TextView tvBolo;
	private TextView txtvDosis;
	private TextView txtvDilu;
	private TextView tvTipo;
	private TextView lblTipo;
	
	private Typeface fuenteTitulo;
	private Typeface fuenteParrafo;
	
	private float dosis_anterior;
	private float peso_anterior;
	private int ampolla_anterior;
	private int dilucion_anterior;
	
	private LocationManager locationManager;
	private String proveedor="";
	private Geolocalizacion geo;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.showdetail_drugs);
		
		this.inisializar();
		TextView presentationM = (TextView) findViewById(R.id.presentationMedicamento);
		presentationM.setTypeface(this.fuenteParrafo);
		TextView boloM = (TextView) findViewById(R.id.boloMedicamento);
		boloM.setTypeface(this.fuenteParrafo);
		TextView dosis = (TextView) findViewById(R.id.dosis);
		dosis.setTypeface(this.fuenteParrafo);
		this.tvAmp.setTextColor(Color.GRAY);
		TextView peso2 = (TextView) findViewById(R.id.peso1);
		peso2.setTypeface(this.fuenteTitulo);
		peso2.setTextColor(Color.GRAY);
		this.mngr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
		this.imei = mngr.getDeviceId();
		TextView nameM = (TextView) findViewById(R.id.NombreMedicamento);
		nameM.setTypeface(this.fuenteTitulo);
		
		//Analytics
		GoogleAnalytics.getInstance(this).getTracker("UA-45986553-2");
		//-------------
		
		// Geolocalizacion
		coordenadas = new Double[2];
		this.locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
		this.proveedor = LocationManager.NETWORK_PROVIDER;
		this.geo = new Geolocalizacion(locationManager);
		
		//segunda parte de this
		dosisIntroducida.addTextChangedListener(this);
		pesoIntroducido.addTextChangedListener(this);

		if (GlobalConfiguration.getSingletonObject().getSelectedMedicamento() != null) {
			temMed = GlobalConfiguration.getSingletonObject().getSelectedMedicamento();
			
			sp = (Spinner) findViewById(R.id.spinner);
			llenarSpiner(sp);
			sp.setSelection(1);
			sp.setOnItemSelectedListener(this);

			nameM.setText(this.nombreMedicamentoInfusion = temMed.getNombre());
			presentationM.setText(temMed.getPrecentacion());
			this.lblTipo.setText(temMed.getTipo());
			boloM.setText(temMed.getBolo());
			dosis.setText(temMed.getRango1dosis() + "-"
					+ temMed.getRango2dosis() + " " + temMed.getUnidadesDosis());
			EditText peso = (EditText) findViewById(R.id.peso2);
			if (!temMed.getUnidadesDosis().equals("µg/kg/min")&&!temMed.getUnidadesDosis().equals("µg/kg/h")
					&&!temMed.getUnidadesDosis().equals("UI/kg/h")&&!temMed.getUnidadesDosis().equals("mg/kg/h")
					&&!temMed.getUnidadesDosis().equals("ng/kg/min")) {
				peso2.setVisibility(View.INVISIBLE);
				peso.setVisibility(View.INVISIBLE);
			}
		}
	}

	public void llenarSpiner(Spinner sp) {
		ArrayAdapter adapter = ArrayAdapter.createFromResource(this,
				R.array.diluciones, android.R.layout.simple_spinner_item);
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		sp.setAdapter(adapter);
	}

	public void formula(View view) {
		float resultado=0;
		float peso2=0;
		if (((this.dosisIntroducida.getText().toString().equals("") || pesoIntroducido.getText().toString().equals("") ||
				  ampollasIntroducidas.getText().toString().equals(""))&&(temMed.getUnidadesDosis().equals("µg/kg/min")||
						temMed.getUnidadesDosis().equals("µg/kg/h")||temMed.getUnidadesDosis().equals("UI/kg/h")||
						temMed.getUnidadesDosis().equals("mg/kg/h")))||((this.dosisIntroducida.getText().toString().equals("") 
							|| ampollasIntroducidas.getText().toString().equals(""))&&
							(temMed.getUnidadesDosis().equals("µg/min")||temMed.getUnidadesDosis().equals("mg/min")||
									temMed.getUnidadesDosis().equals("UI/h")||temMed.getUnidadesDosis().equals("mg/h")))) {
			
			Toast.makeText(this, getResources().getString(R.string.toastCamposIncompletos),Toast.LENGTH_LONG).show();
		}
		else{
			float dosis2 = Float.parseFloat(this.dosisInfusion = dosisIntroducida.getText().toString());
			this.pesoInfusion = pesoIntroducido.getText().toString();
			if(!this.pesoInfusion.equals("") && this.pesoInfusion.charAt(0) != '.'){
				peso2 = Float.parseFloat(this.pesoInfusion);
			}
			int ampoyetas2 = Integer.parseInt(this.ampollasInfusion = ampollasIntroducidas.getText().toString());
			
			if (dosis2 != this.dosis_anterior || peso2 != this.peso_anterior|| ampoyetas2 != this.ampolla_anterior
					|| this.dilucion != this.dilucion_anterior) {
				if (dosis2 >= Float.parseFloat(temMed.getRango1dosis()) 
						&& dosis2 <= Float.parseFloat(temMed.getRango2dosis())) {
					if (temMed.getUnidadesDosis().equals("µg/kg/min")||temMed.getUnidadesDosis().equals("ng/kg/min")) {
						if(pesoIntroducido.getText().toString().charAt(0) != '.' &&
								Float.parseFloat(pesoIntroducido.getText().toString())>=10 &&
								Float.parseFloat(pesoIntroducido.getText().toString())<=180){
							resultado = (dosis2 * peso2 * dilucion * 60)/ (ampoyetas2 * Float.parseFloat(temMed.getConcentracion()));
						}
						else {
							Toast.makeText(this, getResources().getString(R.string.toastPesoErroneo),Toast.LENGTH_LONG).show();
						}
					}
					else if(temMed.getUnidadesDosis().equals("µg/kg/h")||temMed.getUnidadesDosis().equals("UI/kg/h")
							||temMed.getUnidadesDosis().equals("mg/kg/h")){
						if(pesoIntroducido.getText().toString().charAt(0) != '.' &&
								Float.parseFloat(pesoIntroducido.getText().toString())>=10 &&
								Float.parseFloat(pesoIntroducido.getText().toString())<=180){
							resultado = (dosis2 * peso2 * dilucion)/ (ampoyetas2 * Float.parseFloat(temMed.getConcentracion()));
						}
						else {
							Toast.makeText(this, getResources().getString(R.string.toastPesoErroneo),Toast.LENGTH_LONG).show();
						}
					}
					else if(temMed.getUnidadesDosis().equals("UI/h")||temMed.getUnidadesDosis().equals("mg/h")){
						resultado = (dosis2 * dilucion)/ (ampoyetas2 * Float.parseFloat(temMed.getConcentracion()));
					}
					else{// mg/min y Micro/m
						resultado = (dosis2 * dilucion * 60)/ (ampoyetas2 * Float.parseFloat(temMed.getConcentracion()));
					}
					if(resultado!=0){
						//---Analytics---
						EasyTracker easyTracker = EasyTracker.getInstance(this);
						easyTracker.send(MapBuilder
							      .createEvent("ui_action",     // Event category (required)
							                   "infusion_press",  // Event action (required)
							                   temMed.getNombre(),   // Event label
							                   null)  // Event value
							      .build()
							  );
						//----Fin Analytics-----
						
						this.dilu.setText(getResources().getString(R.string.lblDiluir)+" ");
						this.namp.setText(String.valueOf(ampoyetas2));
						this.ampen.setText(" "+getResources().getString(R.string.lblAmpEn)+" ");
						this.vol.setText(String.valueOf(dilucion) + " cc");
						this.pasen.setText(getResources().getString(R.string.lblPasar)+" ");
						this.res.setText(String.valueOf(new DecimalFormat("##.##").format(resultado))+ " cc/h");
						this.dosis_anterior = dosis2;
						this.peso_anterior = peso2;
						this.ampolla_anterior = ampoyetas2;
						this.dilucion_anterior = this.dilucion;
						new EnviarInfusion().execute();
					}
				}
				else {
					String mensaje = getResources().getString(R.string.toastDosisErronea) +
							"\n" + temMed.getRango1dosis() + " - " + temMed.getRango2dosis() + " " + temMed.getUnidadesDosis();
					Toast noti = Toast.makeText(this, mensaje,Toast.LENGTH_LONG);
					noti.setGravity(Gravity.CENTER, 0, 0);
					noti.show();
				}
			}
		}
	}

	private boolean hayInternet() {
		ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
		if (cm.getActiveNetworkInfo() != null
				&& cm.getActiveNetworkInfo().isAvailable()
				&& cm.getActiveNetworkInfo().isConnected()) {
			return true;
		} else {
			return false;
		}
	}
	
	public void quitar(View view){
		this.finish();
	}
	
	public void GestionArchivos(String[] parametros) {

		try {
			this.archivoEntrada = new InputStreamReader(
					openFileInput("infusiones.txt"));

			String texto = this.archivos.leer(this.archivoEntrada);
			if (texto != null) {
				this.info = texto + parametros[1] + "#" + parametros[2] + "#"
						+ parametros[3] + "#" + parametros[4] + "#"
						+ parametros[5] + "#" + parametros[6] +"#"+ parametros[7] + "&";
			} else {
				this.info = parametros[1] + "#" + parametros[2] + "#"
						+ parametros[3] + "#" + parametros[4] + "#"
						+ parametros[5] + "#" + parametros[6] +"#"+ parametros[7] + "&";
			}
			archivoSalida = new OutputStreamWriter(openFileOutput(
					"infusiones.txt", Activity.MODE_PRIVATE));
			this.archivos.guardar(archivoSalida, info);
		} catch (FileNotFoundException e) {

			this.info = parametros[1] + "#" + parametros[2] + "#"
					+ parametros[3] + "#" + parametros[4] + "#" + parametros[5]
					+ "#" + parametros[6] + "#" + parametros[7] + "&";
			try {
				archivoSalida = new OutputStreamWriter(openFileOutput(
						"infusiones.txt", Activity.MODE_PRIVATE));
			} catch (FileNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			this.archivos.guardar(archivoSalida, info);
		}

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.menu_lista, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {

		case R.id.item1:
			Intent intent = new Intent(this, Ayuda.class);
			startActivity(intent);
			break;

		case R.id.item2:
			finish();
		}
		return true;
	}

	public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
			long arg3) {
		dilucion = Integer.parseInt(arg0.getItemAtPosition(arg2).toString());

	}

	public void onNothingSelected(AdapterView<?> arg0) {
		// TODO Auto-generated method stub

	}

	private class EnviarInfusion extends AsyncTask<String, Void, Void> {

		@Override
		protected Void doInBackground(String... params) {
			boolean guardado;
			if (hayInternet()) {
				coordenadas=geo.obtenerCoordenadas();
				String[] parametros = { "registroInfusionPro", imei,
						nombreMedicamentoInfusion, temMed.presentacion,dosisInfusion, pesoInfusion,
						String.valueOf(dilucion), ampollasInfusion, String.valueOf(coordenadas[0]),
						String.valueOf(coordenadas[1]) };
				JSONArray respuesta = ws.conectar(parametros);
				try {
					JSONObject res = respuesta.getJSONObject(0);
					guardado = res.getBoolean("respuesta");
					if (!guardado) {
						GestionArchivos(parametros);
					}
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					GestionArchivos(parametros);
				}
				return null;
			} else {
				String[] parametros = { "registroInfusionOldPro", imei,
						nombreMedicamentoInfusion, temMed.presentacion,dosisInfusion, pesoInfusion,
						String.valueOf(dilucion), ampollasInfusion, "null", "null" };
				GestionArchivos(parametros);
			}
			return null;
		}

		protected void onPostExecute(Void result) {
			super.onPostExecute(result);
		}

	}
	
	/***
	 * metodo para inicializar los controles de la interfaz y tenerlos vinculados a la logica de la aplicaci??n.
	 */
	
	public void inisializar(){
		this.fuenteTitulo = Typeface.createFromAsset(getAssets(),"Roboto-Regular.ttf");
		this.fuenteParrafo = Typeface.createFromAsset(getAssets(),"Roboto-Light.ttf");
		this.ws = new WebService();
		this.archivos = new Archivos();
		this.tvDosis=(TextView) findViewById(R.id.textDosis);
		this.tvAmp=(TextView) findViewById(R.id.textApm);
		this.tvTipo=(TextView) findViewById(R.id.tvTipo);
		this.dosis_anterior=0;
		this.peso_anterior=0;
		this.ampolla_anterior=0;
		this.dilucion_anterior=0;
		this.lblTipo=(TextView) findViewById(R.id.lblTipo);
		this.lblTipo.setTypeface(this.fuenteParrafo);
		this.dilu = (TextView) findViewById(R.id.diluir);
		this.dilu.setTypeface(this.fuenteParrafo);
		this.namp = (TextView) findViewById(R.id.namp);
		this.namp.setTypeface(this.fuenteTitulo);
		this.ampen = (TextView) findViewById(R.id.nampollasen);
		this.ampen.setTypeface(this.fuenteParrafo);
		this.vol = (TextView) findViewById(R.id.volumendilu);
		this.vol.setTypeface(this.fuenteTitulo);
		this.pasen = (TextView) findViewById(R.id.pasaren);
		this.pasen.setTypeface(this.fuenteParrafo);
		this.res = (TextView) findViewById(R.id.resultado);
		this.res.setTypeface(this.fuenteTitulo);
		this.tvPresen = (TextView) findViewById(R.id.tvPresent);
		this.tvBolo = (TextView) findViewById(R.id.tvBolo);
		this.txtvDosis = (TextView) findViewById(R.id.tvDosis);
		this.txtvDilu = (TextView) findViewById(R.id.tvdiluc);
		this.txtvDilu.setTypeface(this.fuenteParrafo);
		this.txtvDilu.setTextColor(Color.GRAY);
		this.tvPresen.setTypeface(this.fuenteTitulo);
		this.tvBolo.setTypeface(this.fuenteTitulo);
		this.txtvDosis.setTypeface(this.fuenteTitulo);
		this.tvDosis.setTextColor(Color.GRAY);
		this.tvDosis.setTypeface(this.fuenteTitulo);
		this.tvAmp.setTypeface(this.fuenteTitulo);
		this.tvTipo.setTypeface(this.fuenteTitulo);
		
		this.dosisIntroducida = (EditText) findViewById(R.id.dosisdos);
		this.dosisIntroducida.setTypeface(this.fuenteParrafo);
		this.dosisIntroducida.setTextColor(Color.parseColor("#444B4B"));
		this.pesoIntroducido = (EditText) findViewById(R.id.peso2);
		this.pesoIntroducido.setTypeface(this.fuenteParrafo);
		this.pesoIntroducido.setTextColor(Color.parseColor("#444B4B"));
		this.ampollasIntroducidas = (EditText) findViewById(R.id.ampollasen);
		this.ampollasIntroducidas.setTypeface(this.fuenteParrafo);
		this.ampollasIntroducidas.setTextColor(Color.parseColor("#444B4B"));
	}

	public void afterTextChanged(Editable s) {
		// TODO Auto-generated method stub
		
	}

	public void beforeTextChanged(CharSequence s, int start, int count,
			int after) {
		// TODO Auto-generated method stub
		
	}

	public void onTextChanged(CharSequence s, int start, int before, int count) {
		// TODO Auto-generated method stub

		String texto = s.toString();

		if (this.dosisIntroducida.getText().hashCode() == s.hashCode()) {
			if (!s.toString().equals("")) {
				if (s.toString().equals(".")) 
				
				{
					texto = "0" + texto;
					this.dosisIntroducida.setText(texto);
					this.dosisIntroducida.setSelection(texto.length());
				}
				
				float dosis2 = Float.parseFloat(texto);
				if (dosis2 >= Float.parseFloat(temMed.getRango1dosis()) && dosis2 <= Float.parseFloat(temMed.getRango2dosis())) {
					this.dosisIntroducida.setBackgroundDrawable(getResources().getDrawable(R.drawable.correcto));
				} else {
					this.dosisIntroducida.setBackgroundDrawable(getResources().getDrawable(R.drawable.incorrecto));
				}
			} else {
				this.dosisIntroducida.setBackgroundDrawable(getResources().getDrawable(R.drawable.incorrecto));
			}
		}

		else if (this.pesoIntroducido.getText().hashCode() == s.hashCode()) {
			
			if (s.toString().equals("") || s.toString().charAt(0)=='.' || Float.parseFloat(s.toString())<10|| Float.parseFloat(s.toString())>180) {
				this.pesoIntroducido.setBackgroundDrawable(getResources().getDrawable(R.drawable.incorrecto));
			}
			else{
				this.pesoIntroducido.setBackgroundDrawable(getResources().getDrawable(R.drawable.correcto));
			}
		}
	}

	 @Override
	  public void onStart() {
	    super.onStart();
	    EasyTracker.getInstance(this).activityStart(this); 
	    if (!proveedor.equals("")) {
			// Register the listener with the Location Manager to receive location updates
			locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this.geo);
		}
	  }
	 
	 @Override
	  public void onStop() {
	    super.onStop();
	    EasyTracker.getInstance(this).activityStop(this); 
	    this.locationManager.removeUpdates(this.geo);
	  }
	 
	 @Override
		public void onResume() {
			super.onResume();
			// Activamos notificaciones de localizaci???n
			if (!proveedor.equals("")) {
				// Register the listener with the Location Manager to receive location updates
				locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this.geo);
			}

		}

		@Override
		public void onPause() {
			super.onPause();
			// Desactivamos notificaciones para ahorrar bater???a
			this.locationManager.removeUpdates(this.geo);
		}
}
